Reformat the pfn_info structure to ensure that
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 5 Oct 2005 22:47:09 +0000 (23:47 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 5 Oct 2005 22:47:09 +0000 (23:47 +0100)
lock cmpxchg8b instructions occur only on naturally
aligned 8-byte memory values. This is needed for some
NUMA x86 systems.

Signed-off-by: Keir Fraser <keir@xensource.com>
Signed-off-by: Aravindh Puthiyaparambil <first.last@unisys.com>
xen/arch/x86/x86_32/mm.c
xen/arch/x86/x86_64/mm.c
xen/include/asm-x86/mm.h

index 25c2ea7a7d89863854b275dc4b3590f23a99e557..64491f02d977d57c5dbc2e665e59576496565325 100644 (file)
@@ -156,6 +156,7 @@ void subarch_init_memory(struct domain *dom_xen)
      */
     if ( (offsetof(struct pfn_info, u.inuse._domain) != 
           (offsetof(struct pfn_info, count_info) + sizeof(u32))) ||
+         ((offsetof(struct pfn_info, count_info) & 7) != 0) ||
          (sizeof(struct pfn_info) != 24) )
     {
         printk("Weird pfn_info layout (%ld,%ld,%d)\n",
index 76b35181114864124231586fe3224a15bac98a9e..a20c900fb0b31f647066c9962afa86b5b0fe7979 100644 (file)
@@ -137,8 +137,10 @@ void subarch_init_memory(struct domain *dom_xen)
      * count_info and domain fields must be adjacent, as we perform atomic
      * 64-bit operations on them.
      */
-    if ( (offsetof(struct pfn_info, u.inuse._domain) != 
-          (offsetof(struct pfn_info, count_info) + sizeof(u32))) )
+    if ( ((offsetof(struct pfn_info, u.inuse._domain) != 
+           (offsetof(struct pfn_info, count_info) + sizeof(u32)))) ||
+         ((offsetof(struct pfn_info, count_info) & 7) != 0) ||
+         (sizeof(struct pfn_info) != 40) )
     {
         printk("Weird pfn_info layout (%ld,%ld,%ld)\n",
                offsetof(struct pfn_info, count_info),
index a68538c0a745db46b12a95990faa6a52316737be..9b79f86d6f4a76cd22632be79b1a6f325963a2e8 100644 (file)
@@ -22,9 +22,6 @@ struct pfn_info
     /* Each frame can be threaded onto a doubly-linked list. */
     struct list_head list;
 
-    /* Timestamp from 'TLB clock', used to reduce need for safety flushes. */
-    u32 tlbflush_timestamp;
-
     /* Reference count and various PGC_xxx flags and fields. */
     u32 count_info;
 
@@ -37,17 +34,20 @@ struct pfn_info
             u32 _domain; /* pickled format */
             /* Type reference count and various PGT_xxx flags and fields. */
             unsigned long type_info;
-        } inuse;
+        } __attribute__ ((packed)) inuse;
 
         /* Page is on a free list: ((count_info & PGC_count_mask) == 0). */
         struct {
+            /* Order-size of the free chunk this page is the head of. */
+            u32 order;
             /* Mask of possibly-tainted TLBs. */
             cpumask_t cpumask;
-            /* Order-size of the free chunk this page is the head of. */
-            u8 order;
-        } free;
+        } __attribute__ ((packed)) free;
 
     } u;
+
+    /* Timestamp from 'TLB clock', used to reduce need for safety flushes. */
+    u32 tlbflush_timestamp;
 };
 
  /* The following page types are MUTUALLY EXCLUSIVE. */